#ifndef _MAINTHREAD_H
#define _MAINTHREAD_H
#include <QObject>
#include <QThread>
#include "rtdb.h"
#include "ComStruct.h"
#include "KgGlobalData.h"
#include <QSettings>
#include <QDir>

class devData
{
public:
    unsigned long long m_uAddress;
    quint16 m_uFunc; 
    quint16 m_uDelayMs;
    quint16 m_uCommTimeout;       
    quint16 m_uCommState; 
    quint16 m_uCommLastState;
    QDateTime m_Time;
    quint16 m_uRev[10];
    float m_fRev[10];
    QDateTime m_tRev[10];
};

class MainThread: public QThread
{
    Q_OBJECT
public:
	MainThread(QObject *parent = 0, CRTDB *pRTDB = 0, int bcIndex = 0);
	~MainThread();
private:
	void run();	

	CRTDB *m_pRTDB;
	CBattStack *m_pBattStack;
    quint16 m_emDevCount;
    quint16 m_acDevCount;
    quint16 m_lcDevCount;
    quint16 m_dhDevCount;
    quint16 m_thDevCount;
    quint16 m_wsDevCount;
    quint16 m_xfDevCount;
    quint16 m_hkDevCount;
    quint16 m_upsDevCount;
    quint16 m_bmsDevCount;
    quint16 m_pcsDevCount;
    QList<devData> m_emList;
    QList<devData> m_acList;
    QList<devData> m_lcList;
    QList<devData> m_dhList;
    QList<devData> m_thList;
    QList<devData> m_wsList;
    QList<devData> m_xfList;
    QList<devData> m_hkList;
    QList<devData> m_upsList;
    QList<devData> m_bmsList;
    QList<devData> m_pcsList;

    void readEmData(void); // 读二次侧数据 乘上变比
    void funcEm10(devData &dev, CMeterData *pEmData, int index); //【645】【DLT-645-2007多功能电能表通信协议】
    void funcEm20(devData &dev, CMeterData *pEmData, int index); //【安科瑞】【201 DTSD1352导轨式多功能电能表安装使用说明书V2.10】
    void funcEm21(devData &dev, CMeterData *pEmData, int index); //【安科瑞】【509 AEM72三相多功能电能表安装说明书v1.0】
    void funcEm22(devData &dev, CMeterData *pEmData, int index); //【安科瑞】【527 AMC系列智能电量采集监控装置安装使用说明书V3.2】
    void funcEm23(devData &dev, CMeterData *pEmData, int index); //【安科瑞】【513 ADL系列导轨式多功能电能表V1.0】
    void funcEm24(devData &dev, CMeterData *pEmData, int index); //【安科瑞】【475 APM5系列网络电力仪表安装使用说明书V1.2】
    void funcEm25(devData &dev, CMeterData *pEmData, int index); //【安科瑞】【350 ADW300系列无线计量仪表说明书V1.3】
    void funcEm26(devData &dev, CMeterData *pEmData, int index); //【安科瑞】【096 ADL3000三相多功能表使用说明书V1.0】
    void funcEm27(devData &dev, CMeterData *pEmData, int index); //【安科瑞】【167 外置罗氏线圈和开合式互感器导轨谐波表V1.5】
    void funcEm28(devData &dev, CMeterData *pEmData, int index); //【安科瑞】【412 ADL200单相电子式电能表使用说明书V1.7】
    void funcEm60(devData &dev, CMeterData *pEmData, int index); //【正泰】【DTSU666昆仑系列新国标的说明书】
    void funcEm140(devData &dev, CMeterData *pEmData, int index); //【三奥】【SA800E三相多功能表】
    void funcEm150(devData &dev, CMeterData *pEmData, int index); //【派诺】【三相导轨式多功能智能电表微型V2.2】
    void funcEm160(devData &dev, CMeterData *pEmData, int index); //【鸿引】【EL6系列单三相-通讯规约】

    void readAcData(void);    
    void funcAc10(devData &dev, CAcData *pAcData, int index); //【英维克】【U3-EC空调MODBUS协议A3】 
    void funcAc11(devData &dev, CAcData *pAcData, int index); //【英维克】【U3-EC空调MODBUS协议A6】
    void funcAc12(devData &dev, CAcData *pAcData, int index); //【英维克】【储能风冷-Modbus协议A1-V160】
    void funcAc20(devData &dev, CAcData *pAcData, int index); //【同飞】【ECA通信地址表A6】
    void funcAc30(devData &dev, CAcData *pAcData, int index); //【黑盾】【工业空调(AC-P)Modbus通讯协议V3.3】
    void funcAc40(devData &dev, CAcData *pAcData, int index); //【朗进】【工业变频一体化空调项目ModBus协议V1.2】
    void funcAc41(devData &dev, CAcData *pAcData, int index); //【朗进】【工业空调项目Modbus协议V1.4】
    void funcAc100(devData &dev, CAcData *pAcData, int index); //【锐劲特】【柜门空调空调协议(modbus)-通用V003】
    void funcAc110(devData &dev, CAcData *pAcData, int index); //【海信】【空调modbus温控运行版本A0】

    void readLcData(void); 
    void funcLc10(devData &dev, CLcData *pLcData, int index); //【同飞】【LCI-30CR-01Z-1227】
    void funcLc11(devData &dev, CLcData *pLcData, int index); //【同飞】【LCI-xxCR-10Z3-1227与LCI-xxCR-03Z3-1227】
    void funcLc12(devData &dev, CLcData *pLcData, int index); //【同飞】【LCI-450CR-20(TFZL)】
    void funcLc13(devData &dev, CLcData *pLcData, int index); //【同飞】【LCI-400CR-20(TJRY)】
    void funcLc21(devData &dev, CLcData *pLcData, int index); //【英维克】【EMW系列单-双系统机组通信协议-A0.7】
    void funcLc22(devData &dev, CLcData *pLcData, int index); //【英维克】【EMW系列双系统机组通讯协议-A4-0513】
    void funcLc40(devData &dev, CLcData *pLcData, int index); //【盾安】【SL6100-ES-DA】
    void funcLc60(devData &dev, CLcData *pLcData, int index); //【新淼】【液冷机组控制通信协议】
    void funcLc120(devData &dev, CLcData *pLcData, int index); //【沃派】【储能液冷监控通讯协议V1.0】
    void funcLc130(devData &dev, CLcData *pLcData, int index); //【海信】【远程监控Modbus点表map-60Kw】
    void funcLc131(devData &dev, CLcData *pLcData, int index); //【海信】【液冷机型Modbus点表map-20231018】
    void funcLc140(devData &dev, CLcData *pLcData, int index); //【兆胜】【液冷机组通信协议V1.0】
    void funcLc150(devData &dev, CLcData *pLcData, int index); //【TCL】【液冷空调rs485通信协议V04】
    void funcLc160(devData &dev, CLcData *pLcData, int index); //【华涧】【ETMSSAVA065008电控通讯及对外接口定义-V1.0】

    void readDhData(void);
    void funcDh10(devData &dev, CDhData *pDhData, int index); //【同飞】【500mL除湿机通讯地址表】
    void funcDh20(devData &dev, CDhData *pDhData, int index); //【三达】【SDCS-DJ200半导体除湿装置说明书】
    void funcDh21(devData &dev, CDhData *pDhData, int index); //【三达】【SDCS-7LD除湿机说明书】
    void funcDh30(devData &dev, CDhData *pDhData, int index); //【保瑞】【除湿器RS-485通讯说明】
    void funcDh60(devData &dev, CDhData *pDhData, int index); //【共创】【除湿器modbus通讯协议V1.0】
    void funcDh61(devData &dev, CDhData *pDhData, int index); //【共创】【除湿器modbus通讯协议V2.0】
    void funcDh62(devData &dev, CDhData *pDhData, int index); //【共创】【除湿器RS485_Modbus通讯协议V1.2】
    void funcDh70(devData &dev, CDhData *pDhData, int index); //【除湿器60W金属款】
    void funcDh80(devData &dev, CDhData *pDhData, int index); //【安第斯】【商用机通讯协议】
    void funcDh100(devData &dev, CDhData *pDhData, int index); //【英维克】【MC03除湿机-Modbus通信协议-A3】
    void funcDh140(devData &dev, CDhData *pDhData, int index); //【兆胜】【ZDA04除湿机通信协议V1.0】

    void readThData(void);
    void funcTh10(devData &dev, CThData *pThData, int index); //【建大仁科】【RS-WS-N01-8扁卡轨温湿度变送器使用说明书V2.3】
    void funcTh11(devData &dev, CThData *pThData, int index); //【建大仁科】【防爆温湿度变送器用户手册V1.0】
    void funcTh12(devData &dev, CThData *pThData, int index); //【建大仁科】【86壳液晶温湿度变送器使用说明书V2.2】
    void funcTh20(devData &dev, CThData *pThData, int index); //【安科瑞】【WHD系列温湿度控制器V1.3】
    void funcTh30(devData &dev, CThData *pThData, int index); //【祥为】【XW-210-485通讯协议】
    void funcTh40(devData &dev, CThData *pThData, int index); //【宇泰】【UT-5521P温湿度变送器说明书】
    void funcTh50(devData &dev, CThData *pThData, int index); //【西门子】【室内湿度及空气质量传感器】
    
    void readWsData(void);
    void funcWs10(devData &dev, CWaterData *pWsData, int index); //【建大仁科】【RS-SJ-N01R01-2-王子壳水浸传感器说明书V3.0】
    void funcWs20(devData &dev, CWaterData *pWsData, int index); //【祥为】【XW-PC-1-485通讯协议】
    void funcWs30(devData &dev, CWaterData *pWsData, int index); //【宇泰】【UT-5535产品说明书V1.1】

    void readXfData(void);
    void funcXf10(devData &dev, CFireData *pXfData, int index); //【千页】【电化学储能报警控制器输出通信协议V2.2】
    void funcXf30(devData &dev, CFireData *pXfData, int index); //【泽福】【储能电站用火灾报警控制装置通讯协议-V1.1】
    void funcXf50(devData &dev, CFireData *pXfData, int index); //【正华同安】【升级智能机架Modbus协议V1.1】
    void funcXf51(devData &dev, CFireData *pXfData, int index); //【正华同安】【ZH-1005火灾报警控制器Modbus协议V1.4】
    void funcXf60(devData &dev, CFireData *pXfData, int index); //【达翔】【储能消防舱级Modbus485-RTU通信协议V2.7】
    void funcXf90(devData &dev, CFireData *pXfData, int index); //【鼎信】【鼎信控制器远程联网通信协议】
    void funcXf100(devData &dev, CFireData *pXfData, int index); //【众安】【GST200H GST-INET-03H卡】
    void funcXf140(devData &dev, CFireData *pXfData, int index); //【缔群】【电化学储能安防产品控制主机-RS485协议V1.2】
    void funcXf150(devData &dev, CFireData *pXfData, int index); //【V3000-CN01通用Modbus协议V1】

    void readHkData(void);
    void funcHk10(devData &dev, CEcData *pHkData, int index); //【国能龙源】【防爆版环控机与BMS通讯协议】

    void readUpsData(void);
    void funcUps10(devData &dev, CUpsData *pUpsData, int index); //【捷易达】【RU630的安装与应用V3.1】    
    void funcUps20(devData &dev, CUpsData *pUpsData, int index); //【易事特】【EA900 G3 1-3K协议转换卡Modbus通信协议V1.0】
    void funcUps30(devData &dev, CUpsData *pUpsData, int index); //【MODBUS_UPS_C_v1.0】

    void readBmsData(void);
    void funcBms10(devData &dev, int index); //【科工】【BMS与PCS设备Modbus规约及点表-BMS做主机】
    void funcBms11(devData &dev, int index); //【科工】【BMS与PCS设备Modbus规约及点表-BMS做主机(从机不应答)】
    void funcBms12(devData &dev, int index); //【科工】【BMS与PCS设备Modbus规约及点表-BMS做从机】
    void funcBms50(devData &dev, int index); //【禾望】【PCS与BMS的Modbus-RTU通信规约-BMS做主机】
    void funcBms60(devData &dev, int index); //【汇川】【BSMU-ModbusRTU与PCS通讯协议_汇川_V1.8】
    void funcBms61(devData &dev, int index); //【汇川】【IES900_BSMU-ModbusRTU与PCS通讯协议_汇川_P3(支路)】

    void readPcsData(void);
    void funcPcs30(devData &dev, CPcsData *pPcsData, int index); //【首航】【EBI系列储能变流器PCS与EMS之间的Modbus外部通讯协议V1.7】

    QString m_sComName;
    quint32 m_uComBaudRate;
    quint16 m_uComDataBit;
    quint16 m_uComParity;
    quint16 m_uComStopBit;    

	bool m_bOpen;
    int m_bcIndex;
	int ret;
    quint8 temp8;
    quint16 temp16;
    quint32 temp32;
    quint64 temp64;
    
    float tempf;

    char m_pSend[512];
    char m_pRecv[512];
    CXnSerial m_serial;
    int serialPortInit(void);
	int readRegData(quint16 devAddr,quint8 funCode,quint16 startAddr,quint16 regCnt);	
    int setSingleRegData(quint16 devAddr,quint8 funCode,quint16 startAddr,quint16 regVal);
    int setMultipleRegData(quint16 devAddr,quint8 funCode,quint16 startAddr,quint16 regCnt,quint16 *dataBuf);  
    int setMultipleRegDataNoAsk(quint16 devAddr,quint8 funCode,quint16 startAddr,quint16 regCnt,quint16 *dataBuf); 
    int readHostData(unsigned long devAddr);
    int askHostData(quint16 devAddr,quint8 funCode,quint16 regCnt,quint16 *dataBuf);    
    int read645Data(unsigned long devAddr, quint32 regAddr, quint16 regCnt);

    int m_isOutputLog;    
 	KgLogFile m_logFile; 
    QString m_strLog;      
    void devConfig(void); 
    void writeKgLogfile(QString strInfo,bool bSaveToFile=false);  
};

#define KG_MAX_LOG_SIZE     1024*1024*10
#define KG_LOG_INFO(MESSAGE)\
	do{ \
        QString strInfor;\
        QString currentFileName = QFileInfo(__FILE__).fileName();\
        QString currentFileLine = QString::number(__LINE__);\
        strInfor = currentFileName + "(" + currentFileLine + ") " + MESSAGE;\
        writeKgLogfile(strInfor,true);\
	} while(0)

#endif
